package day12;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author: 王丹
 * @create: 2021-07-05 11:32
 * 关于tryLock()方法和tryLock(long timeout, TimeUnit unit)方法，说明一下：
 * 都会返回boolean值，结果表示获取锁是否成功
 * tryLock()方法，不管是否获取成功，都会立即返回；而有参的tryLock方法会尝试在指定的时间内去获取锁，
 * 中间会阻塞的现象，在指定的时间之后会不管是否能够获取锁都会返回结果
 * tryLock()方法不会响应线程的中断方法；而有参的tryLock方法会响应线程的中断方法，
 * 而出发 InterruptedException异常，这个从2个方法的声明上可以可以看出来
 **/
public class Demo9 {

    private static ReentrantLock lock = new ReentrantLock(false);

    public static class T extends Thread {
        private T(String name) {
            super(name);
        }

        public void run() {
            System.out.println(System.currentTimeMillis() + this.getName() + " 开始获取锁 ");
            try {
                //tryLock无参方法:返回boolean类型的值，此方法会立即返回，结果表示获取锁是否成功
                if (lock.tryLock(3,TimeUnit.SECONDS)) {
                    System.out.println(System.currentTimeMillis() + this.getName() + " 获取到锁 ");
                    TimeUnit.SECONDS.sleep(5);
                } else {
                    System.out.println(System.currentTimeMillis() + this.getName() + " 未获取到锁 ");
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //查询当前线程是否保持此锁定
                if (lock.isHeldByCurrentThread()){
                    lock.unlock();
                }
            }
        }
    }

    public static void main(String[] args) {
        T t1 = new T("t1");
        T t2 = new T("t2");

        t1.start();
        t2.start();
    }
}
